@using System.Threading.Tasks
@using Microsoft.EntityFrameworkCore
@using jiuyuan.服务
@using jiuyuan.数据.基础数据类
@using jiuyuan.数据.怪物类
@using jiuyuan.管理器

<div class="admin-container">
    <div class="admin-header">
        <h3>游戏副本管理</h3>
        <button class="btn-primary" @onclick="添加新副本">添加新副本</button>
    </div>

    <div class="admin-content">
        @if (!数据已加载)
        {
            <div class="loading">正在加载数据...</div>
        }
        else
        {
            <div class="item-list">
                @foreach (var 副本 in 显示副本列表)
                {
                    <div class="item-card">
                        <div class="item-info">
                            <h4>@副本.名称</h4>
                            <p>等级要求: @副本.等级要求</p>
                            <p>推荐人数: @副本.推荐人数 人</p>
                            <p>事件节点数: @副本.事件节点列表.Count</p>
                        </div>
                        <div class="item-actions">
                            <button class="action-button view-button" @onclick='() => 查看副本详情(副本)'>查看</button>
                            <button class="action-button edit-button" @onclick='() => 编辑副本(副本)'>编辑</button>
                            <button class="action-button delete-button" @onclick='() => 删除副本(副本.Id)'>删除</button>
                        </div>
                    </div>
                }
            </div>
        }
    </div>
</div>

<!-- 副本详情弹窗 -->
<div class="modal" style="display: @(显示详情弹窗 ? "block" : "none");">
    <div class="modal-content">
        <div class="modal-header">
            <h3>副本详情</h3>
            <button class="close-button" @onclick="关闭详情弹窗">&times;</button>
        </div>
        <div class="modal-body">
            @if (选中的副本 != null)
            {
                <div class="detail-grid">
                    <div class="detail-item">
                        <label>副本名称:</label>
                        <span>@选中的副本.名称</span>
                    </div>
                    <div class="detail-item">
                        <label>等级要求:</label>
                        <span>@选中的副本.等级要求</span>
                    </div>
                    <div class="detail-item">
                        <label>推荐人数:</label>
                        <span>@选中的副本.推荐人数 人</span>
                    </div>
                    <div class="detail-item">
                        <label>图标:</label>
                        <span>@选中的副本.图标</span>
                    </div>
                    <div class="detail-item full-width">
                        <label>描述:</label>
                        <span>@选中的副本.描述</span>
                    </div>
                    <div class="detail-item">
                        <label>创建时间:</label>
                        <span>@选中的副本.创建时间.ToString("yyyy-MM-dd HH:mm")</span>
                    </div>
                    <div class="detail-item">
                        <label>更新时间:</label>
                        <span>@选中的副本.更新时间.ToString("yyyy-MM-dd HH:mm")</span>
                    </div>
                    <div class="detail-item full-width">
                        <label>事件节点:</label>
                        <div class="node-list">
                            @if (选中的副本.事件节点列表.Any())
                            {
                                @foreach (var 节点 in 选中的副本.事件节点列表.OrderBy(n => n.顺序))
                                {
                                    <div class="node-item">
                                        <span>@节点.顺序. @节点.名称 (@节点.类型)</span>
                                    </div>
                                }
                            }
                            else
                            {
                                <span>暂无事件节点</span>
                            }
                        </div>
                    </div>
                </div>
            }
        </div>
    </div>
</div>

<!-- 编辑副本弹窗 -->
<div class="modal" style="display: @(显示编辑弹窗 ? "block" : "none");">
    <div class="modal-content large">
        <div class="modal-header">
            <h3>@(IsEditing ? "编辑副本" : "添加新副本")</h3>
            <button class="close-button" @onclick="关闭编辑弹窗">&times;</button>
        </div>
        <div class="modal-body">
            @if (当前副本 != null)
            {
                <div class="form-grid">
                    <div class="form-group">
                        <label for="dungeonName">副本名称:</label>
                        <input type="text" id="dungeonName" @bind="当前副本.名称" class="form-control" />
                    </div>
                    <div class="form-group">
                        <label for="dungeonLevel">等级要求:</label>
                        <input type="number" id="dungeonLevel" @bind="当前副本.等级要求" class="form-control" />
                    </div>
                    <div class="form-group">
                        <label for="dungeonRecommendedPlayers">推荐人数:</label>
                        <input type="number" id="dungeonRecommendedPlayers" @bind="当前副本.推荐人数" class="form-control" />
                    </div>
                    <div class="form-group">
                        <label for="dungeonIcon">图标:</label>
                        <input type="text" id="dungeonIcon" @bind="当前副本.图标" class="form-control" />
                    </div>
                    <div class="form-group full-width">
                        <label for="dungeonDescription">描述:</label>
                        <textarea id="dungeonDescription" @bind="当前副本.描述" class="form-control" rows="3"></textarea>
                    </div>
                </div>

                <!-- 事件节点管理 -->
                <div class="section-divider">
                    <h4>事件节点管理</h4>
                </div>
                
                <div class="node-management">
                    <div class="node-header">
                        <h5>事件节点列表</h5>
                        <button class="btn-primary small" @onclick="添加新节点">添加节点</button>
                    </div>
                    
                    <div class="node-list">
                        @if (当前副本.事件节点列表.Any())
                        {
                            @foreach (var 节点 in 当前副本.事件节点列表.OrderBy(n => n.顺序))
                            {
                                <div class="node-item">
                                    <div class="node-info">
                                        <span>@节点.顺序. @节点.名称 (@节点.类型)</span>
                                    </div>
                                    <div class="node-actions">
                                        <button class="action-button edit-button small" @onclick='() => 编辑节点(节点)'>编辑</button>
                                        <button class="action-button delete-button small" @onclick='() => 删除节点(节点.Id)'>删除</button>
                                    </div>
                                </div>
                            }
                        }
                        else
                        {
                            <div class="no-data">暂无事件节点</div>
                        }
                    </div>
                </div>

                <div class="btn-group">
                    <button class="btn-primary" @onclick="保存副本">@(!IsEditing ? "添加" : "更新")</button>
                    <button class="btn-secondary" @onclick="关闭编辑弹窗">取消</button>
                </div>
            }
        </div>
    </div>
</div>

<!-- 编辑节点弹窗 -->
<div class="modal" style="display: @(显示节点弹窗 ? "block" : "none");">
    <div class="modal-content large">
        <div class="modal-header">
            <h3>@(IsEditingNode ? "编辑事件节点" : "添加事件节点")</h3>
            <button class="close-button" @onclick="关闭节点弹窗">&times;</button>
        </div>
        <div class="modal-body">
            @if (当前节点 != null)
            {
                <div class="form-grid">
                    <div class="form-group">
                        <label for="nodeName">节点名称:</label>
                        <input type="text" id="nodeName" @bind="当前节点.名称" class="form-control" />
                    </div>
                    <div class="form-group">
                        <label for="nodeOrder">顺序:</label>
                        <input type="number" id="nodeOrder" @bind="当前节点.顺序" class="form-control" />
                    </div>
                    <div class="form-group">
                        <label for="nodeType">节点类型:</label>
                        <select id="nodeType" @bind="当前节点.类型" class="form-control">
                            <option value="战斗">战斗</option>
                            <option value="剧情">剧情</option>
                            <option value="宝箱">宝箱</option>
                            <option value="休息">休息</option>
                        </select>
                    </div>
                    <div class="form-group full-width">
                        <label for="nodeDescription">描述:</label>
                        <textarea id="nodeDescription" @bind="当前节点.描述" class="form-control" rows="3"></textarea>
                    </div>
                </div>

                <!-- 剧情内容 (仅剧情节点) -->
                @if (当前节点.类型 == "剧情")
                {
                    <div class="section-divider">
                        <h5>剧情内容</h5>
                    </div>
                    
                    <div class="form-group full-width">
                        <label for="storyContent">剧情内容:</label>
                        <textarea id="storyContent" @bind="当前节点.剧情内容" class="form-control" rows="5"></textarea>
                    </div>
                }

                <!-- 怪物生成配置 (仅战斗节点) -->
                @if (当前节点.类型 == "战斗")
                {
                    <div class="section-divider">
                        <h5>怪物生成配置</h5>
                        <button class="btn-primary small" @onclick="添加怪物生成">添加怪物</button>
                    </div>
                    
                    <div class="monster-list">
                        @if (当前节点.怪物生成列表.Any())
                        {
                            @for (int i = 0; i < 当前节点.怪物生成列表.Count; i++)
                            {
                                var index = i;
                                <div class="monster-item">
                                    <div class="form-grid">
                                        <div class="form-group">
                                            <label>怪物:</label>
                                            <div class="item-selection">
                                                <span>@(当前节点.怪物生成列表[index].怪物详情?.名称 ?? "未选择")</span>
                                                <button class="action-button edit-button small" @onclick='() => 打开选择怪物弹窗(index)'>选择</button>
                                            </div>
                                        </div>
                                        <div class="form-group">
                                            <label>数量:</label>
                                            <input type="number" @bind="当前节点.怪物生成列表[index].数量" class="form-control" />
                                        </div>
                                        <div class="form-group">
                                            <label>&nbsp;</label>
                                            <button class="action-button delete-button" @onclick='() => 删除怪物生成(index)'>删除</button>
                                        </div>
                                    </div>
                                </div>
                            }
                        }
                        else
                        {
                            <div class="no-data">暂无怪物生成配置</div>
                        }
                    </div>
                }

                <!-- 掉落物品配置 (战斗和宝箱节点) -->
                @if (当前节点.类型 == "战斗" || 当前节点.类型 == "宝箱")
                {
                    <div class="section-divider">
                        <h5>掉落物品配置</h5>
                        <button class="btn-primary small" @onclick="_ => 添加掉落物品(物品列表)">添加掉落物品</button>
                    </div>
                    
                    <div class="drop-item-list">
                        @if (当前节点.掉落物品列表.Any())
                        {
                            @for (int i = 0; i < 当前节点.掉落物品列表.Count; i++)
                            {
                                var index = i;
                                <div class="drop-item">
                                    <div class="form-grid">
                                        <div class="form-group">
                                            <label>物品:</label>
                                            <div class="item-selection">
                                                <span>@(当前节点.掉落物品列表[index].物品详情?.名称 ?? "未选择")</span>
                                                <button class="action-button edit-button small" @onclick='() => 打开选择物品弹窗(index)'>选择</button>
                                            </div>
                                        </div>
                                        <div class="form-group">
                                            <label>掉落概率:</label>
                                            <input type="number" step="0.01" min="0" max="1" @bind="当前节点.掉落物品列表[index].掉落概率" class="form-control" />
                                        </div>
                                        <div class="form-group">
                                            <label>最小数量:</label>
                                            <input type="number" @bind="当前节点.掉落物品列表[index].最小数量" class="form-control" />
                                        </div>
                                        <div class="form-group">
                                            <label>最大数量:</label>
                                            <input type="number" @bind="当前节点.掉落物品列表[index].最大数量" class="form-control" />
                                        </div>
                                        <div class="form-group">
                                            <label>&nbsp;</label>
                                            <button class="action-button delete-button" @onclick='() => 删除掉落物品(index)'>删除</button>
                                        </div>
                                    </div>
                                </div>
                            }
                        }
                        else
                        {
                            <div class="no-data">暂无掉落物品配置</div>
                        }
                    </div>
                }

                <div class="btn-group">
                    <button class="btn-primary" @onclick="保存节点">@(!IsEditingNode ? "添加" : "更新")</button>
                    <button class="btn-secondary" @onclick="关闭节点弹窗">取消</button>
                </div>
            }
        </div>
    </div>
</div>

<!-- 选择怪物弹窗 -->
<div class="modal" style="display: @(显示选择怪物弹窗 ? "block" : "none");">
    <div class="modal-content">
        <div class="modal-header">
            <h3>选择怪物</h3>
            <button class="close-button" @onclick="关闭选择怪物弹窗">&times;</button>
        </div>
        <div class="modal-body">
            <div class="item-list">
                @foreach (var 怪物 in 怪物列表)
                {
                    <div class="item-card">
                        <div class="item-info">
                            <h4>@怪物.名称</h4>
                            <p>等级: @怪物.等级</p>
                        </div>
                        <div class="item-actions">
                            <button class="action-button edit-button" @onclick='() => 选择怪物(怪物)'>选择</button>
                        </div>
                    </div>
                }
            </div>
        </div>
    </div>
</div>

<!-- 选择物品弹窗 -->
<div class="modal" style="display: @(显示选择物品弹窗 ? "block" : "none");">
    <div class="modal-content">
        <div class="modal-header">
            <h3>选择物品</h3>
            <button class="close-button" @onclick="关闭选择物品弹窗">&times;</button>
        </div>
        <div class="modal-body">
            <div class="item-list">
                @foreach (var 物品 in 物品列表)
                {
                    <div class="item-card">
                        <div class="item-info">
                            <h4>@物品.名称</h4>
                        </div>
                        <div class="item-actions">
                            <button class="action-button edit-button" @onclick='() => 选择物品(物品)'>选择</button>
                        </div>
                    </div>
                }
            </div>
        </div>
    </div>
</div>

<style>
    .admin-container {
        height: 100%;
        display: flex;
        flex-direction: column;
    }

    .admin-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        padding-bottom: 15px;
        border-bottom: 2px solid #4a2c8d;
    }

    .admin-content {
        flex: 1;
        overflow-y: auto;
    }

    .item-list {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
        gap: 20px;
    }

    .item-card {
        background-color: rgba(30, 30, 60, 0.8);
        border: 1px solid #4a2c8d;
        border-radius: 8px;
        padding: 20px;
        transition: all 0.3s ease;
    }

    .item-card:hover {
        background-color: rgba(40, 40, 80, 0.9);
        border-color: #6a0dad;
        box-shadow: 0 0 15px rgba(106, 13, 173, 0.5);
    }

    .item-info h4 {
        color: #b19cd9;
        margin-bottom: 10px;
        font-size: 1.2rem;
    }

    .item-info p {
        color: #a0a0e0;
        margin: 5px 0;
        font-size: 0.9rem;
    }

    .item-actions {
        display: flex;
        gap: 10px;
        margin-top: 15px;
        justify-content: flex-end;
    }

    .action-button {
        padding: 8px 15px;
        border: none;
        border-radius: 5px;
        cursor: pointer;
        transition: all 0.3s ease;
        font-size: 0.9rem;
    }

    .view-button {
        background-color: rgba(30, 60, 120, 0.8);
        color: #a0c0ff;
    }

    .view-button:hover {
        background-color: rgba(40, 80, 160, 0.9);
        box-shadow: 0 0 10px rgba(64, 128, 255, 0.5);
    }

    .edit-button {
        background-color: rgba(60, 120, 60, 0.8);
        color: #a0ffa0;
    }

    .edit-button:hover {
        background-color: rgba(80, 160, 80, 0.9);
        box-shadow: 0 0 10px rgba(128, 255, 128, 0.5);
    }

    .delete-button {
        background-color: rgba(120, 60, 60, 0.8);
        color: #ffa0a0;
    }

    .delete-button:hover {
        background-color: rgba(160, 80, 80, 0.9);
        box-shadow: 0 0 10px rgba(255, 128, 128, 0.5);
    }

    .small {
        padding: 5px 10px;
        font-size: 0.8rem;
    }

    .btn-primary {
        padding: 10px 20px;
        background: linear-gradient(to right, #4a2c8d, #6a0dad);
        border: none;
        border-radius: 5px;
        color: white;
        cursor: pointer;
        transition: all 0.3s ease;
        font-size: 1rem;
    }

    .btn-primary:hover {
        background: linear-gradient(to right, #5a3c9d, #7a1ddd);
        box-shadow: 0 0 15px rgba(106, 13, 173, 0.7);
    }

    .btn-secondary {
        padding: 10px 20px;
        background: linear-gradient(to right, #3a3a5a, #5a5a7a);
        border: none;
        border-radius: 5px;
        color: #e0e0ff;
        cursor: pointer;
        transition: all 0.3s ease;
        font-size: 1rem;
    }

    .btn-secondary:hover {
        background: linear-gradient(to right, #4a4a6a, #6a6a8a);
        box-shadow: 0 0 15px rgba(90, 90, 122, 0.7);
    }

    .btn-group {
        display: flex;
        gap: 15px;
        margin-top: 20px;
        justify-content: flex-end;
    }

    .loading {
        text-align: center;
        padding: 30px;
        color: #a0a0e0;
        font-size: 1.2rem;
    }

    /* 弹窗样式 */
    .modal {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background-color: rgba(0, 0, 0, 0.7);
        z-index: 1000;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    .modal-content {
        background-color: rgba(20, 20, 40, 0.95);
        border: 2px solid #4a2c8d;
        border-radius: 10px;
        width: 90%;
        max-width: 800px;
        max-height: 90%;
        overflow-y: auto;
        box-shadow: 0 0 30px rgba(106, 13, 173, 0.8);
    }

    .modal-content.large {
        max-width: 1000px;
    }

    .modal-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 20px;
        border-bottom: 1px solid #4a2c8d;
    }

    .modal-header h3 {
        color: #b19cd9;
        margin: 0;
    }

    .close-button {
        background: none;
        border: none;
        color: #b19cd9;
        font-size: 1.8rem;
        cursor: pointer;
        padding: 0;
        width: 30px;
        height: 30px;
        display: flex;
        align-items: center;
        justify-content: center;
    }

    .close-button:hover {
        color: #ff5555;
    }

    .modal-body {
        padding: 20px;
    }

    /* 表单样式 */
    .form-grid {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
        gap: 20px;
        margin-bottom: 20px;
    }

    .form-group {
        margin-bottom: 15px;
    }

    .form-group.full-width {
        grid-column: 1 / -1;
    }

    .form-group label {
        display: block;
        margin-bottom: 5px;
        color: #a0a0e0;
        font-weight: 500;
    }

    .form-control {
        width: 100%;
        padding: 10px;
        background-color: rgba(30, 30, 60, 0.8);
        border: 1px solid #4a2c8d;
        border-radius: 5px;
        color: #e0e0ff;
        font-size: 1rem;
    }

    .form-control:focus {
        outline: none;
        border-color: #6a0dad;
        box-shadow: 0 0 10px rgba(106, 13, 173, 0.5);
    }

    textarea.form-control {
        resize: vertical;
        min-height: 80px;
    }

    select.form-control {
        appearance: none;
        background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a0a0e0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
        background-repeat: no-repeat;
        background-position: right 10px center;
        background-size: 15px;
    }

    /* 详情样式 */
    .detail-grid {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
        gap: 20px;
    }

    .detail-item {
        margin-bottom: 15px;
    }

    .detail-item.full-width {
        grid-column: 1 / -1;
    }

    .detail-item label {
        display: block;
        color: #a0a0e0;
        font-weight: 500;
        margin-bottom: 5px;
    }

    .detail-item span {
        display: block;
        color: #e0e0ff;
        padding: 8px;
        background-color: rgba(30, 30, 60, 0.8);
        border: 1px solid #4a2c8d;
        border-radius: 5px;
    }

    /* 分隔线 */
    .section-divider {
        margin: 30px 0 20px;
        padding-bottom: 10px;
        border-bottom: 1px solid #4a2c8d;
    }

    .section-divider h4, .section-divider h5 {
        color: #b19cd9;
        margin: 0;
    }

    /* 节点列表 */
    .node-list {
        margin-top: 15px;
    }

    .node-item {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 15px;
        background-color: rgba(30, 30, 60, 0.8);
        border: 1px solid #4a2c8d;
        border-radius: 5px;
        margin-bottom: 10px;
    }

    .node-info {
        flex: 1;
        color: #e0e0ff;
    }

    .node-actions {
        display: flex;
        gap: 10px;
    }

    .node-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 15px;
    }

    .node-header h5 {
        color: #b19cd9;
        margin: 0;
    }

    /* 无数据提示 */
    .no-data {
        text-align: center;
        padding: 20px;
        color: #a0a0e0;
        font-style: italic;
    }

    /* 掉落物品列表 */
    .drop-item-list {
        margin-top: 15px;
    }

    .drop-item {
        padding: 15px;
        background-color: rgba(30, 30, 60, 0.8);
        border: 1px solid #4a2c8d;
        border-radius: 5px;
        margin-bottom: 15px;
    }

    .drop-item-info {
        color: #e0e0ff;
    }

    .drop-item-info strong {
        color: #b19cd9;
    }

    /* 技能列表 */
    .skill-list {
        margin-top: 15px;
    }

    .skill-item {
        display: flex;
        justify-content: space-between;
        align-items: center;
        padding: 15px;
        background-color: rgba(30, 30, 60, 0.8);
        border: 1px solid #4a2c8d;
        border-radius: 5px;
        margin-bottom: 10px;
    }

    .skill-info {
        flex: 1;
        color: #e0e0ff;
    }

    .skill-info strong {
        color: #b19cd9;
    }
</style>

@code {
    // 注入服务
    [Inject] public 配置加载器 配置加载器 { get; set; } = default!;

    [Inject] public ILogger<副本管理> Logger { get; set; } = default!;

    [Inject]
    游戏数据库上下文 数据库上下文 { get; set; } = default!;

    // 实际的副本数据列表（从数据库获取）
    private List<副本配置> 副本列表 = new List<副本配置>();

    // 用于显示的副本列表（直接使用实际副本数据）
    private List<副本配置> 显示副本列表 = new List<副本配置>();

    // 实际的怪物数据列表（从数据库获取）
    private List<怪物> 怪物列表 = [];

    // 实际的物品数据列表（从数据库获取）
    private List<游戏元素> 物品列表 = [];

    private bool 数据已加载 = false;

    private 副本配置 当前副本 = new 副本配置();
    private 副本配置 选中的副本 = new 副本配置();
    private 事件节点 当前节点 = new 事件节点();
    private bool IsEditing = false;
    private Guid 编辑中的副本Id = Guid.Empty;
    private bool 显示详情弹窗 = false;
    private bool 显示编辑弹窗 = false;
    private bool 显示节点弹窗 = false;
    private bool IsEditingNode = false;
    private Guid 编辑中的节点Id = Guid.Empty;
    // 新增：用于选择怪物和物品的弹窗
    private bool 显示选择怪物弹窗 = false;
    private bool 显示选择物品弹窗 = false;
    private int 当前编辑的怪物索引 = -1;
    private int 当前编辑的物品索引 = -1;

    // 事件回调，用于通知其他组件数据已更新
    [Parameter] public EventCallback OnDungeonsChanged { get; set; }

    // 页面初始化时加载数据
    protected override async Task OnInitializedAsync()
    {
        await 加载数据();
    }

    // 从数据库加载所有数据
    private async Task 加载数据()
    {
        try
        {
            // 使用串行方式加载数据，避免DbContext并发访问问题
            副本列表 = await 配置加载器.获取所有副本();
            显示副本列表 = 副本列表;

            怪物列表 = await 配置加载器.获取所有怪物();

            物品列表 = await 配置加载器.获取所有游戏元素(); // 使用元素作为物品

            数据已加载 = true;
            StateHasChanged();
        }
        catch (Exception ex)
        {
            Logger.LogError(ex, "加载数据时发生错误");
        }
    }

    private void 查看副本详情(副本配置 副本)
    {
        选中的副本 = 副本;
        显示详情弹窗 = true;
    }

    private void 关闭详情弹窗()
    {
        显示详情弹窗 = false;
    }

    private void 添加新副本()
    {
        当前副本 = new 副本配置();
        IsEditing = false;
        编辑中的副本Id = Guid.Empty;
        显示编辑弹窗 = true;
    }

    private void 编辑副本(副本配置 副本)
    {
        当前副本 = new 副本配置
        {
            Id = 副本.Id,
            名称 = 副本.名称,
            描述 = 副本.描述,
            等级要求 = 副本.等级要求,
            图标 = 副本.图标,
            创建时间 = 副本.创建时间,
            更新时间 = 副本.更新时间,
            推荐人数 = 副本.推荐人数,
            事件节点列表 = new List<事件节点>(副本.事件节点列表)
        };
        IsEditing = true;
        编辑中的副本Id = 副本.Id;
        显示编辑弹窗 = true;
    }

    private void 关闭编辑弹窗()
    {
        显示编辑弹窗 = false;
    }

    private async Task 删除副本(Guid 副本Id)
    {
        var 副本 = 显示副本列表.FirstOrDefault(d => d.Id == 副本Id);
        if (副本 != null)
        {
            显示副本列表.Remove(副本);
            副本列表.Remove(副本);

            // 从数据库中删除副本
            // 注意：这里应该调用配置加载器的删除方法，但目前没有实现
            // 作为临时解决方案，我们重新加载数据
            await 加载数据();
        }
    }

    private async Task 保存副本()
    {
        if (string.IsNullOrWhiteSpace(当前副本.名称))
            return;

        try
        {
            // 保存到数据库
            await 配置加载器.保存副本配置(当前副本);

            // 更新显示列表
            if (!IsEditing)
            {
                // 添加新副本
                显示副本列表.Add(当前副本);
                副本列表.Add(当前副本);
            }
            else
            {
                // 更新现有副本
                var existingDungeon = 显示副本列表.FirstOrDefault(d => d.Id == 编辑中的副本Id);
                if (existingDungeon != null)
                {
                    var index = 显示副本列表.IndexOf(existingDungeon);
                    显示副本列表[index] = 当前副本;

                    var originalIndex = 副本列表.IndexOf(existingDungeon);
                    副本列表[originalIndex] = 当前副本;
                }
            }

            // 关闭弹窗
            显示编辑弹窗 = false;

            // 重新加载数据以确保一致性
            await 加载数据();

            // 触发事件通知其他组件数据已更新
            if (OnDungeonsChanged.HasDelegate)
            {
                await OnDungeonsChanged.InvokeAsync();
            }
        }
        catch (Exception ex)
        {
            Logger.LogError(ex, "保存副本时发生错误");
        }
    }

    // 节点相关方法
    private void 添加新节点()
    {
        当前节点 = new 事件节点();
        IsEditingNode = false;
        编辑中的节点Id = Guid.Empty;
        显示节点弹窗 = true;
    }

    private void 编辑节点(事件节点 节点)
    {
        当前节点 = new 事件节点
        {
            Id = 节点.Id,
            名称 = 节点.名称,
            描述 = 节点.描述,
            顺序 = 节点.顺序,
            类型 = 节点.类型,
            怪物生成列表 = new List<怪物生成配置>(节点.怪物生成列表),
            掉落物品列表 = new List<掉落物品>(节点.掉落物品列表),
            剧情内容 = 节点.剧情内容
        };
        IsEditingNode = true;
        编辑中的节点Id = 节点.Id;
        显示节点弹窗 = true;
    }

    private void 关闭节点弹窗()
    {
        显示节点弹窗 = false;
    }

    private async Task 保存节点()
    {
        if (string.IsNullOrWhiteSpace(当前节点.名称))
            return;

        // 更新当前副本中的节点
        if (!IsEditingNode)
        {
            // 添加新节点
            当前节点.Id = Guid.CreateVersion7();
            // 设置副本配置Id以建立外键关系
            当前节点.副本配置Id = 当前副本.Id;
            当前副本.事件节点列表.Add(当前节点);
        }
        else
        {
            // 更新现有节点
            var existingNode = 当前副本.事件节点列表.FirstOrDefault(n => n.Id == 编辑中的节点Id);
            if (existingNode != null)
            {
                var index = 当前副本.事件节点列表.IndexOf(existingNode);
                当前副本.事件节点列表[index] = 当前节点;
            }
        }

        // 保存整个副本到数据库
        await 保存副本();

        // 关闭弹窗
        显示节点弹窗 = false;
    }

    private void 删除节点(Guid 节点Id)
    {
        var 节点 = 当前副本.事件节点列表.FirstOrDefault(n => n.Id == 节点Id);
        if (节点 != null)
        {
            当前副本.事件节点列表.Remove(节点);
        }
    }

    // 怪物生成相关方法
    private void 添加怪物生成()
    {
        当前节点.怪物生成列表.Add(new 怪物生成配置());
    }

    private void 删除怪物生成(int index)
    {
        if (index >= 0 && index < 当前节点.怪物生成列表.Count)
        {
            当前节点.怪物生成列表.RemoveAt(index);
        }
    }

    // 掉落物品相关方法
    private async Task 添加掉落物品(List<游戏元素> 物品)
    {
        if(物品.Count <= 0) return;
        foreach (var 掉落 in 物品)
        {
            var 怪物掉落物品 = new 掉落物品(掉落);
            当前节点.掉落物品列表.Add(怪物掉落物品);
        }
    }

    private void 删除掉落物品(int index)
    {
        if (index >= 0 && index < 当前节点.掉落物品列表.Count)
        {
            当前节点.掉落物品列表.RemoveAt(index);
        }
    }

    // 新增：选择物品相关方法
    private void 打开选择物品弹窗(int index)
    {
        当前编辑的物品索引 = index;
        显示选择物品弹窗 = true;
    }

    private void 关闭选择物品弹窗()
    {
        显示选择物品弹窗 = false;
        当前编辑的物品索引 = -1;
    }

    private void 选择物品(游戏元素 物品)
    {
        if (当前编辑的物品索引 >= 0 && 当前编辑的物品索引 < 当前节点.掉落物品列表.Count)
        {
            // 创建新的掉落物品实例，避免引用问题
            var 新掉落物品 = new 掉落物品(物品, 1.0f, 1, 1);
            当前节点.掉落物品列表[当前编辑的物品索引] = 新掉落物品;
        }
        关闭选择物品弹窗();
    }

    // 新增：选择怪物相关方法
    private void 打开选择怪物弹窗(int index)
    {
        当前编辑的怪物索引 = index;
        显示选择怪物弹窗 = true;
    }

    private void 关闭选择怪物弹窗()
    {
        显示选择怪物弹窗 = false;
        当前编辑的怪物索引 = -1;
    }

    private void 选择怪物(怪物 怪物)
    {
        if (当前编辑的怪物索引 >= 0 && 当前编辑的怪物索引 < 当前节点.怪物生成列表.Count)
        {
            当前节点.怪物生成列表[当前编辑的怪物索引].怪物ID = 怪物.Id;
            当前节点.怪物生成列表[当前编辑的怪物索引].怪物详情 = 怪物;
        }
        关闭选择怪物弹窗();
    }
}